gsk: Allow creating cairo contexts for 0x0 nodes
authorBenjamin Otte <otte@redhat.com>
Tue, 15 Nov 2016 06:01:27 +0000 (07:01 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 15 Nov 2016 16:49:19 +0000 (17:49 +0100)
This happens in regular code paths for example when trying to render the
empty text string. We don't want to store a surface on the render
node in such a case (so actual rendering isn't slowed down), but we do
want to return a working cairo context that is not in an error state
(so the cairo rendering can continue without error messages).

gsk/gskrendernode.c

index 7c463a62ce7d6ceb89a78090d532688b5acf5166..be64fbad461d3b8f69d711d8d3b3789265aa3c4f 100644 (file)
@@ -1420,13 +1420,23 @@ cairo_t *
 gsk_render_node_get_draw_context (GskRenderNode *node,
                                   GskRenderer   *renderer)
 {
+  int width, height;
   cairo_t *res;
 
   g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
   g_return_val_if_fail (node->is_mutable, NULL);
   g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL);
 
-  if (node->surface == NULL)
+  width = ceilf (node->bounds.size.width);
+  height = ceilf (node->bounds.size.height);
+
+  if (width <= 0 || height <= 0)
+    {
+      cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0);
+      res = cairo_create (surface);
+      cairo_surface_destroy (surface);
+    }
+  else if (node->surface == NULL)
     {
       if (renderer)
         {
@@ -1443,9 +1453,12 @@ gsk_render_node_get_draw_context (GskRenderNode *node,
                                                       ceilf (node->bounds.size.width),
                                                       ceilf (node->bounds.size.height));
         }
+      res = cairo_create (node->surface);
+    }
+  else
+    {
+      res = cairo_create (node->surface);
     }
-
-  res = cairo_create (node->surface);
 
   cairo_translate (res, -node->bounds.origin.x, -node->bounds.origin.y);